Programs are run on a computing device as one or more processes, each of which can be made up of one or more threads that execute on the processor(s) of the computing device. The threads can run at different priority levels, with higher priority threads typically being executed prior to and/or more frequently than lower priority threads. However, situations can arise in which two different threads running on a computing device attempt to access the same resource but only one of the threads can access the resource at any given time. This can lead to priority inversion, where a higher priority thread is waiting to execute because it needs to access a resource held by a lower priority thread. This priority inversion can be problematic because it is contrary to the reasons for having thread priorities (allowing higher priority threads to be executed prior to and/or more frequently than lower priority threads).